第 12 章  ·  CrewAI实战解析:程序1题目生成器

第12章 第5节 CrewAI实战解析:程序1题目生成器


第12章 第5节 CrewAI实战解析:程序1题目生成器

阅读指南

上一节我们了解了系统概览和学习目标。本节重点讲解程序1(question_generator.py),通过它深入理解CrewAI三大核心组件:Crew、Agent、Task的协作关系。

5.1 业务流程回顾

程序1实现了从教学大纲到题库的完整流程:

─────────────────────────────────────────
  阶段1: 设计题目框架
  • AI决策:分析大纲,规划题目结构
  • 输出:题目设计方案
─────────────────────────────────────────
  阶段2: 生成具体题目
  • AI决策:生成题目内容和选项
  • 输出:JSON格式题目
─────────────────────────────────────────
  阶段3: 数据持久化
  • 传统业务:保存到 data/questions.json
─────────────────────────────────────────

5.2 CrewAI三大组件的角色分工

在CrewAI框架中,Crew、Agent、Task各司其职,形成了清晰的三层协作结构:

三大组件的职责

组件 类比角色 职责 程序1实例
Crew 项目经理 统筹全局,决定执行模式 ExerciseCrew(Sequential模式)
Agent 专业员工 具备专业能力,执行任务 题目生成专家(QuestionExpert)
Task 具体工作 明确目标和输出要求 Task1: 设计框架 Task2: 生成题目

用团队协作来理解三者关系

想象一个软件公司的项目团队:

ExerciseCrew(团队)
  ├─ 角色:项目经理
  ├─ 持有资源:题目生成专家(员工)、LLM(工具)
  └─ 核心职责:
      • 创建工单(Task1、Task2)
      • 分配给员工(Agent)
      • 决定执行顺序(Sequential模式)
      • 管理工单流转(Task1输出 → Task2输入)

QuestionExpert(员工)
  ├─ 角色:Python教育专家
  ├─ 技能:编程教学、题目设计
  └─ 工作方式:
      • 接收工单(Task)
      • 调用工具(LLM)完成工作
      • 提交成果(输出结果)

Task1 & Task2(工单)
  ├─ Task1工单内容:
  │   • 任务:分析大纲,设计题目框架
  │   • 指派给:QuestionExpert
  │   • 要求:输出Markdown设计方案
  │
  └─ Task2工单内容:
      • 任务:根据Task1方案生成具体题目
      • 指派给:QuestionExpert
      • 依赖:必须等Task1完成
      • 要求:输出JSON格式题目

在程序1中的实际运作

  1. ExerciseCrew创建工单
task1 = create_design_task(self.question_expert, syllabus)
task2 = create_generate_task(self.question_expert, task1.output)

项目经理说:"我需要两个工单,Task1设计框架,Task2生成题目"

  1. ExerciseCrew分配工单给员工
crew = Crew(
    agents=[self.question_expert],  # 员工名单
    tasks=[task1, task2],            # 工单列表
    process=Process.sequential       # 工单顺序:先Task1,再Task2
)

项目经理说:"QuestionExpert,这两个工单都给你,按顺序做"

  1. QuestionExpert执行工单
    • 拿到Task1工单 → 调用LLM → 输出设计方案
    • 拿到Task2工单 → 使用Task1结果 → 调用LLM → 输出JSON题目
  2. ExerciseCrew收集成果
result = crew.kickoff()  # 启动团队工作,等待完成

项目经理说:"开始干活!等你们都做完我收成果"

关键理解

5.3 代码实现:从组件到协作

让我们看看这三个组件如何在代码中协同工作。

步骤1:定义Agent(专业员工)

# agents/question_expert.py

def create_question_expert(llm) -> Agent:
    """创建题目生成专家Agent"""
    return Agent(
        role="Python编程练习题生成专家",
        goal="根据教学大纲设计高质量的Python编程练习题",
        backstory="""
        你是一位经验丰富的Python教育专家,深刻理解初学者的学习路径。
        你擅长将复杂概念转化为清晰的练习题,帮助学生循序渐进地掌握知识。
        """,
        llm=llm,
        verbose=True
    )

关键点

步骤2:定义Task(具体工作)

# tasks/question_tasks.py

def create_design_task(agent: Agent, syllabus: str) -> Task:
    """创建Task1:设计题目框架"""
    return Task(
        description=f"""
        基于以下教学大纲,设计练习题的整体框架:

        {syllabus}

        要求:
        1. 分析大纲的知识点层次
        2. 规划题目的难度梯度
        3. 设计题目类型分布
        """,
        expected_output="题目框架设计方案(Markdown格式)",
        agent=agent  # 指定由哪个Agent执行
    )

def create_generate_task(agent: Agent, design_result: str) -> Task:
    """创建Task2:生成具体题目(依赖Task1输出)"""
    return Task(
        description=f"""
        根据以下设计方案,生成5道选择题:

        {design_result}

        要求:
        1. 严格遵循JSON格式
        2. 每题4个选项(A/B/C/D)
        3. 包含详细解析
        """,
        expected_output="题目列表(JSON格式)",
        agent=agent,
        context=[design_result]  # 依赖Task1的输出
    )

关键点

步骤3:Crew协调执行(项目经理)

# crews/exercise_crew.py

class ExerciseCrew:
    """统一的Crew,负责协调所有阶段"""

    def __init__(self, llm):
        self.llm = llm
        self.question_expert = create_question_expert(llm)

    def run_question_generation(self, syllabus: str) -> str:
        """
        程序1调用:执行题目生成流程(Sequential模式)
        """
        # 创建两个Task
        task1 = create_design_task(self.question_expert, syllabus)
        task2 = create_generate_task(self.question_expert, task1.output)

        # 创建Crew并执行
        crew = Crew(
            agents=[self.question_expert],
            tasks=[task1, task2],
            process=Process.sequential,  # Sequential模式
            verbose=True
        )

        result = crew.kickoff()
        return result

关键点

5.4 下一节预告

下一节我们将学习程序2,看看Hierarchical模式如何协调多个Agent并行工作,以及如何将传统代码与AI决策完美融合。

CrewAI 最终实战:习题生成与考试评测系统 CrewAI 实战解析:程序2考试系统与混合架构
本节目录